package x.x.x;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.charset.Charset;

public class UDPSocketService {
    
    /**
     * UDPSocket通信的服务端,如果需要服务端对多个客户端通信,解决方案是监听到通信之后开启单独一个线程对此端口通信
     *@author hanxy17
     * 如修改方法体请自行修改作者信息
     * 当前作者只对自己编写内容负责
     * 2017年3月9日下午5:53:56
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
        DatagramSocket datagramSocket = new DatagramSocket(37211);//通信端口
        //设置通信超时2000ms
        datagramSocket.setSoTimeout(2000);
        byte[] buf = new byte[1000];//存储报文信息
        System.err.println("服务器已经开启!");
        DatagramPacket datagramPacket = new DatagramPacket(buf, buf.length);//为接收到的数据报文开辟空间
        
        datagramSocket.receive(datagramPacket);//等待接收客户端请求的数据报文
        //指定编码获得字符串,方法参数含义(byte[],start,length,charset),其中,[start,start+length)
        String info = new String(buf,0,datagramPacket.getLength(),Charset.forName("UTF-8"));
        System.err.println("服务器接收到客户端发送的info:");
        System.err.println(info);
        
        byte[] reply = "服务器回应客户端的访问,已经监听到你的访问".getBytes();
        InetAddress address = datagramPacket.getAddress();//得到主机地址
        int port = datagramPacket.getPort();//由数据报文得到端口
        DatagramPacket receivePackets = new DatagramPacket(reply, reply.length,address,port);
        datagramSocket.send(receivePackets);//向指定客户端发送信息
        
        datagramSocket.close();
        
    }
}
